//
// Created by Jisam on 2024/7/28 16:08.
// solve e
#include <bits/stdc++.h>

#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>

#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;

using namespace std;

const int N = 1e5 + 5;
i64 ans;

// 定义solve函数，用于解决具体的问题
void solve() {
    // 输入问题的参数，n表示物品数量，x表示背包容量，y表示目标值
    int n, x, y;
    cin >> n >> x >> y;
    // 输入每个物品的重量a和价值b
    vector<int> a(n), b(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i] >> b[i];
    }
    // 初始化动态规划的表格，dp[i][j][k]表示前i个物品，装入重量为j的背包中，能达到的最大价值
    vector<vector<vector<int>>> dp(n + 1, vector(n + 1, vector<int>(x + 1, 1e9)));
    dp[0][0][0] = 0;
    // 动态规划填表，遍历每个物品，更新每个装入状态
    for (int i = 0; i < n; i++) {
        for (int j = 0; j <= i; j++) {
            for (int k = 0; k <= x; k++) {
                // 不装入当前物品，保持之前的状态
                dp[i + 1][j][k] = min(dp[i + 1][j][k], dp[i][j][k]);
                // 如果当前物品可以装入背包，更新装入后的状态
                if (k + a[i] <= x) {
                    dp[i + 1][j + 1][k + a[i]] = min(dp[i + 1][j + 1][k + a[i]], dp[i][j][k] + b[i]);
                }
            }
        }
    }
    // 逆向遍历表格，寻找满足目标值的最小物品数量
    for (int i = n; i >= 0; i--) {
        for (int j = 0; j <= x; j++) {
            if (dp[n][i][j] <= y) {
                // 输出满足条件的最小物品数量
                cout << min(i + 1, n) << "\n";
                return;
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T = 1;
//    cin >> T;
    while (T--) solve();
//    cout << "\n"[];
    return 0;
}